Informe Técnico Exhaustivo

Módulo de Gestión de Alumnos y sus Interacciones

Fecha: 11 de junio de 2025 | Versión: 1.0 | Autor: Maestro Coder AI

1. Introducción y Alcance

Este documento proporciona un análisis técnico detallado del módulo de gestión de alumnos dentro del sistema OTEC. El informe abarca desde la creación y edición de un alumno, la gestión de sus archivos, su interacción con el sistema de cursos a través de las inscripciones, y el mecanismo de borrado lógico en cascada. El objetivo es ofrecer una guía completa para la comprensión, mantenimiento y replicación del módulo.

2. Arquitectura de Datos y Entidades

El módulo de alumnos es una entidad central en el sistema, con múltiples relaciones que definen su participación académica y administrativa.

2.1. Diagrama de Relaciones (Conceptual)

[alumnos] 1--* [inscripciones_curso] *--1 [cursos_sence]
   |
   |--* [documentos_alumno]
   |--* [mensajes_alumno]
   '--* [mensajes_alumno_profesor]

[inscripciones_curso] --* [notas_alumno]
                      |--* [asistencias_alumno]
                      '--* [pagos_alumno]
            

2.2. Tablas y Campos Relevantes

A continuación se detallan las tablas y campos más importantes que participan en la gestión de alumnos, extraído de estructura de tablas curso sence.txt.

Tabla: alumnos

CampoTipoPropósito
idint (PK)Identificador único del alumno.
rutvarchar(20)RUT único del alumno, utilizado para validación.
nombre, apellido_paterno, etc.varchar/text/dateDatos personales básicos.
foto_perfilvarchar(255)Almacena la ruta relativa a la imagen de perfil en el servidor.
estadoenum('activo','inactivo')Pilar del borrado lógico. Controla la visibilidad y operatividad del alumno en el sistema.
modoenum(...)Define el estatus académico del alumno (nuevo, regular, egresado, etc.).

Tabla: inscripciones_curso

Esta es la tabla de unión (junction table) que materializa la relación entre un alumno y un curso.

CampoTipoPropósito
idint (PK)Identificador único de la inscripción.
alumno_idint (FK)Vincula con la tabla alumnos.
curso_idint (FK)Vincula con la tabla cursos_sence.
fecha_inscripcion, valor_final, etc.date/decimalDatos administrativos y financieros de la inscripción.
modoenum(...)Define el estado de avance de la inscripción (inscrito, en_curso, aprobado, etc.).
estadoenum('activo','inactivo')Permite el borrado lógico de una inscripción, conservando el historial pero ocultándola de las vistas activas.

3. Flujos de Proceso y Lógica de Negocio

3.1. Creación y Edición de Alumnos (form_alumno.php)

Este script centraliza la creación y modificación de los datos de un alumno. El proceso es robusto y contempla validaciones, seguridad y gestión de archivos.

  1. Modo de Operación: El script detecta si se está creando o editando un alumno a través de la presencia de $_GET['alumno_id'].
  2. Validación de Datos:
    • Se comprueba que los campos obligatorios (RUT, nombre, apellido paterno) no estén vacíos.
    • Se implementa una validación exhaustiva del RUT chileno mediante las funciones normalizarRut() y validarRutChileno() para asegurar su formato y dígito verificador correctos.
    • Antes de insertar o actualizar, se verifica que el RUT no esté duplicado en la base de datos para otro alumno.
  3. Gestión de Transacciones: Todas las operaciones de escritura en la base de datos se encapsulan en una transacción ($mysqli->begin_transaction()). Si alguna operación falla (ej., la actualización de la foto después de mover el archivo), se revierten todos los cambios con $mysqli->rollback() para mantener la consistencia.
  4. Seguridad: Se utilizan consultas preparadas (prepare, bind_param, execute) para todas las operaciones de inserción y actualización, previniendo eficazmente ataques de inyección SQL.
  5. Gestión de Foto de Perfil:
    • Se valida el tipo (MIME) y tamaño del archivo subido.
    • Se construye una ruta de directorio única y sanitizada para el alumno (ver sección 5).
    • El archivo es movido a su directorio final. Si se está reemplazando una foto anterior, el archivo antiguo es eliminado del servidor con unlink().
    • La ruta relativa final se almacena en el campo alumnos.foto_perfil.

3.2. Inscripción de Alumnos en Cursos (inscribir_alumno.php)

Este script formaliza la relación entre un alumno y un curso, creando un registro en la tabla `inscripciones_curso`.

3.3. Borrado Lógico y Cambio de Estado (cambiar_estado_alumno.php)

El sistema implementa un borrado lógico en cascada para mantener la integridad referencial y el historial de datos. Esta operación es gestionada por el script cambiar_estado_alumno.php.

Proceso de Desactivación (`accion=desactivar`)

¡Operación en Cascada! Desactivar un alumno implica desactivar todos sus registros asociados para prevenir inconsistencias.

Cuando se desactiva un alumno, el script realiza las siguientes acciones dentro de una transacción:

  1. Desactivación de Entidades Dependientes (Nivel 3):
    • Notas: Actualiza notas_alumno.estado = 'inactivo' para todas las notas asociadas a las inscripciones del alumno.
    • Asistencias: Actualiza asistencias_alumno.estado = 'inactivo'.
    • Pagos: Actualiza pagos_alumno.estado = 'inactivo'.
    • Documentos: Actualiza documentos_alumno.estado = 'inactivo'.
    • Mensajes: Actualiza mensajes_alumno_profesor.estado = 'inactivo'.
    • Accesos: Cambia acceso_alumnos_contenido.estado = 'bloqueado'.
  2. Desactivación de Entidades Directas (Nivel 2):
    • Inscripciones: Actualiza inscripciones_curso.estado = 'inactivo' para todas las inscripciones del alumno.
    • Mensajes Generales: Actualiza mensajes_alumno.estado = 'inactivo'.
  3. Desactivación del Alumno (Nivel 1):
    • Finalmente, actualiza alumnos.estado = 'inactivo'.

Proceso de Activación (`accion=activar`)

La reactivación sigue una lógica similar, pero en orden inverso y con ciertas consideraciones:

  1. Activación del Alumno: Primero, actualiza alumnos.estado = 'activo'.
  2. Activación de Entidades Directas: Se reactivan las inscripciones y mensajes que estaban inactivos.
  3. Activación de Entidades Dependientes: Se reactivan notas, asistencias y pagos, pero condicionados al estado de la inscripción (ej., `WHERE inscripcion_id IN (SELECT id FROM inscripciones_curso WHERE alumno_id = ? AND estado = 'inscrito')`), para no activar datos de cursos ya finalizados o reprobados.

4. Interacción y Ubicación de Scripts

El módulo se compone de varios archivos que trabajan en conjunto. Asumiendo una estructura de directorios estándar, esta tabla describe sus roles e interacciones.

ScriptUbicación (Asumida)Propósito PrincipalInteractúa Con
listado_alumnos.php/Muestra la lista de todos los alumnos, con filtros y paginación.form_alumno.php (Crear), ver_alumno.php (Ver), cambiar_estado_alumno.php (Activar/Desactivar).
form_alumno.php/Formulario para crear un nuevo alumno o editar uno existente.Se envía a sí mismo (POST), y al tener éxito redirige a listado_alumnos.php o se recarga en modo edición.
ver_alumno.php/Muestra la ficha detallada de un alumno, incluyendo sus inscripciones.inscribir_alumno.php, form_alumno.php.
inscribir_alumno.php/Permite inscribir a un alumno específico en un curso disponible.Se envía a sí mismo (POST) y al tener éxito redirige a ver_alumno.php.
cambiar_estado_alumno.php/Script de backend (sin UI) que procesa la activación/desactivación en cascada.Recibe la llamada desde listado_alumnos.php y redirige de vuelta al listado.
alumnos_curso.php/Muestra la lista de alumnos inscritos en un curso específico.Recibe el curso_id desde un listado de cursos.

5. Estructura de Archivos de Alumno

La gestión de archivos es un componente crítico para evitar la sobreescritura y mantener el orden. El sistema crea una estructura de directorios dinámica para cada alumno.

5.1. Construcción de la Ruta del Directorio

Al subir una foto para un alumno, el script form_alumno.php construye dinámicamente una ruta basada en los datos del alumno. La función clave es sanitizar_nombre_para_directorio().

Función de Sanitización

function sanitizar_nombre_para_directorio($nombre) {
    if(empty($nombre)) return '';
    $nombre_limpio = strtolower(trim($nombre));
    $mapa_caracteres = [
        'á'=>'a', 'é'=>'e', 'í'=>'i', 'ó'=>'o', 'ú'=>'u', 'ü'=>'u', 'ñ'=>'n',
        'Á'=>'A', 'É'=>'E', 'Í'=>'I', 'Ó'=>'O', 'Ú'=>'U', 'Ü'=>'U', 'Ñ'=>'N',
        '/'=>'_', ' '=>'_'
    ];
    $nombre_limpio = strtr($nombre_limpio, $mapa_caracteres);
    $nombre_limpio = preg_replace('/[^a-z0-9_]/', '', $nombre_limpio);
    $nombre_limpio = preg_replace('/__+/', '_', $nombre_limpio);
    return trim($nombre_limpio, '_');
}

Estructura Final

La ruta completa se ensambla de la siguiente manera, garantizando un directorio único por alumno:

alumno/{ID}_{nombre_san}_{paterno_san}_{materno_san}/foto/

5.2. Nomenclatura de Archivos

Para evitar colisiones de nombres de archivo y problemas de caché en el navegador, los nombres de las fotos subidas se prefijan con un timestamp de Unix.

Ejemplo de nombre de archivo final: 1718134800_foto_perfil.jpg

La ruta completa guardada en la base de datos sería:
alumno/123_juan_perez_gonzalez/foto/1718134800_foto_perfil.jpg